"""
Mock 的 时间
"""

from datetime import (
    date,
    datetime,
    time,
    timedelta,
)


class DATETIME:
    """ Mock 的时间 """

    @staticmethod
    def dt() -> datetime:
        """
        获取当前日期时间 （年-月-日 时:分:秒）

        Examples:
            >>> DATETIME.dt()
            datetime(2022, 12, 9, 9, 30, 17)
        """

        return datetime.strptime(str(datetime.now())[0:19], "%Y-%m-%d %H:%M:%S")

    @staticmethod
    def timestamp() -> int:
        """
        获取当前时间戳 （秒级 10 位整数）

        Examples:
            >>> DATETIME.timestamp()
            1670549417
        """

        return int(datetime.now().timestamp())

    @staticmethod
    def milli_timestamp() -> int:
        """
        获取当前时间戳 （毫秒级 13 位整数）

        Examples:
            >>> DATETIME.milli_timestamp()
            1670549417264
        """

        return int(datetime.now().timestamp() * 1000)

    @staticmethod
    def now() -> datetime:
        """
        获取当前日期时间 （年-月-日 时:分:秒.XXXXXX）

        Examples:
            >>> DATETIME.now()
            datetime(2022, 12, 9, 9, 30, 17, 264460)
        """

        return datetime.now()

    @staticmethod
    def now_str() -> str:
        """
        获取当前日期时间字符串 （年-月-日 时:分:秒）

        Examples:
            >>> DATETIME.now_str()
            "2022-12-09 09:30:17"
        """

        return str(datetime.now())[0:19]

    @staticmethod
    def date() -> date:
        """
        获取当前日期 （年-月-日）

        Examples:
            >>> DATETIME.date()
            date(2022, 12, 9)
        """

        return datetime.now().date()

    @staticmethod
    def yesterday() -> date:
        """
        获取昨天日期 （年-月-日）

        Examples:
            >>> DATETIME.tomorrow()
            date(2022, 12, 08)
        """

        return (datetime.now() - timedelta(days=1)).date()

    @staticmethod
    def tomorrow() -> date:
        """
        获取明天日期 （年-月-日）

        Examples:
            >>> DATETIME.tomorrow()
            date(2022, 12, 10)
        """

        return (datetime.now() + timedelta(days=1)).date()

    @staticmethod
    def week_start() -> date:
        """
        获取本周开始日期 （年-月-日）

        Examples:
            >>> DATETIME.week_start()
            datetime(2022, 12, 5)
        """

        return (datetime.now() - timedelta(days=datetime.now().weekday())).date()

    @staticmethod
    def month_start() -> date:
        """
        获取本月开始日期 （年-月-日）

        Examples:
            >>> DATETIME.month_start()
            date(2022, 12, 1)
        """

        return date(datetime.now().year, datetime.now().month, 1)

    @staticmethod
    def year_start() -> date:
        """
        获取本年开始日期 （年-月-日）

        Examples:
            >>> DATETIME.year_start()
            date(2022, 1, 1)
        """

        return date(datetime.now().year, 1, 1)

    @staticmethod
    def date_str() -> str:
        """
        获取当前日期 （年-月-日）

        Examples:
            >>> DATETIME.date_str()
            "2022-12-09"
        """

        return str(datetime.now().date())

    @staticmethod
    def time() -> time:
        """
        获取当前时间 （时:分:秒.XXXXXX）

        Examples:
            >>> DATETIME.time()
            time(9, 30, 17, 264460)
        """

        return datetime.now().time()

    @staticmethod
    def time_str() -> str:
        """
        获取当前时间字符串 （时:分:秒）

        Examples:
            >>> DATETIME.time_str()
            "09:30:17"
        """

        return str(datetime.now().time())[0:8]
